#include "stm32f10x.h"

/// @brief 输入捕获初始化
/// @param  
void IC_Init(void) {
    // 1.RCC
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 2.GPIO
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 时钟源
    TIM_InternalClockConfig(TIM3);

    // 3.时基单元
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; // ARR，防止溢出，给一个最大值 0xffff(65535)
    // 标准频率为 72MHz / PSC = 1MHz(近似可测量的最高频率,误差很大,测周法不适宜,建议使用测频法)
    // 所能测量的最低频率为 1MHz / 65535 = 15Hz
    // 分频越大,所支持测量的频率越低
    TIM_TimeBaseInitStructure.TIM_Prescaler = 72 + 1 - 1; // PSC
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);


    // 4.输入捕获
    TIM_ICInitTypeDef TIM_ICInitStructure;
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; // 通道
    TIM_ICInitStructure.TIM_ICFilter = 0xF; // 滤波器
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 边沿检测极性选择
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 分频器（不分频）
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直连通道/交叉通道
    TIM_PWMIConfig(TIM3, &TIM_ICInitStructure); // 自动配置另外一个通道（TIM_Channel_2)为相对应的参数

    // 从模式触发源
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); // Filtered Timer Input 1

    // 从模式操作
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); // 自动重置清零

    // 开启定时器
    TIM_Cmd(TIM3, ENABLE);
}

/// @brief 获取频率
/// @param  
/// @return 
uint32_t IC_GetFreq(void) {
    // 标准频率为 72MHz / PSC = 1MHz
    return 1000000 / TIM_GetCapture1(TIM3);
}

/// @brief 获取占空比
/// @param  
/// @return 
uint32_t IC_GetDuty(void) {
    return TIM_GetCapture2(TIM3) * 100 / TIM_GetCapture1(TIM3);
}
